package com.cari.oa.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.springframework.stereotype.Repository;

import com.cari.oa.domain.SysActionEntity;
import com.cari.oa.domain.SysRoleActionRelEntity;
import com.cari.oa.util.StrUtils;

@Repository
public class SysActionDao extends BaseDao<SysActionEntity> {

    /**
     * 根据英文名获取系统操作实体
     * @param enname 系统操作英文名
     * @return 系统实体对象
     */
    public SysActionEntity getByEnname(String enname) {
        Query query = getSession().createQuery("from SysActionEntity where enname = :enname");
        query.setString("enname", enname);
        return (SysActionEntity)query.uniqueResult();
    }

    /**
     * 判断该英文名实体对象是否存在
     * @param enname 系统操作英文名
     * @return 是否存在
     */
    public boolean existByEnname(String enname) {
        Query query = getSession().createQuery("select count(*) from SysActionEntity where enname = :enname");
        query.setString("enname", enname);
        Long count = (Long)query.uniqueResult();
        return count > 0;
    }	
    
    /**
     * 根据角色名称获取关联的所有操作
     * @param roleName 角色英文名
     * @return 操作列表
     */
    @SuppressWarnings("unchecked")
	public List<SysActionEntity> getActionsByRole(String roleName) {
        String hql = "select a from SysRoleActionRelEntity r, SysActionEntity a where r.roleName = :rolename and r.actionName = a.enname ";
        Query query = getSession().createQuery(hql);
        query.setString("rolename", roleName);
        return query.list();
    }
    
    /**
     * 根据角色名清空角色操作关系
     * @param roleName 角色英文名
     */
    public void clearRoleActionRelByRole(String roleName) {
        String hql = "delete from SysRoleActionRelEntity r where r.roleName = :roleName";
        Query query = getSession().createQuery(hql);
        query.setString("roleName", roleName);
        query.executeUpdate();
    }
    
    /**
     * 添加角色操作关系
     * @param roleName 角色英文名
     * @param actionNames 操作英文名列表
     */
    public void addRoleActionRel(String roleName, List<String> actionNames) {
    	for (String actionName : actionNames) {
    		if(StrUtils.isEmpty(actionName)) continue;
			SysRoleActionRelEntity relEntity = new SysRoleActionRelEntity();
			relEntity.setActionName(actionName);
			relEntity.setRoleName(roleName);
			getSession().save(relEntity);
		}
    }
    
    /**
     * 判断操作是否被角色使用
     * @param enname 操作英文名
     * @return 是否被角色使用
     */
    public boolean isActionUsedByRole(String enname) {
        String hql = "select count(*) from SysRoleActionRelEntity r where r.actionName = :enname ";
        Query query = getSession().createQuery(hql);
        query.setString("enname", enname);
        Long count = (Long)query.uniqueResult();
        return count > 0;    	
    }

    /**
     * 分页查询系统操作实体对象
     * @param enname 系统操作英文名
     * @param alias 系统操作别名
     * @param moduleName 所属模块英文名
     * @param page 当前页
     * @param size 每页条数
     * @return 分页实体
     */
    public List<SysActionEntity> getPage(String enname, String alias, String moduleName, int page, int size) {
    	List<Object> params = new ArrayList<Object>();

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("from SysActionEntity a where 1=1 ");

        if(StrUtils.isNotEmpty(enname)) {
            stringBuilder.append("and a.enname like ? ");
            params.add("%" + enname + "%");
        }

        if(StrUtils.isNotEmpty(alias)) {
            stringBuilder.append("and a.alias like ? ");
            params.add("%" + alias + "%");
        }

        if(StrUtils.isNotEmpty(moduleName)) {
            stringBuilder.append("and a.moduleName = ? ");
            params.add(moduleName);
        }

        return getPage(stringBuilder.toString(), page, size, params.toArray());
    }
    
    /**
     * 查询的记录数
     * @param enname 系统操作英文名
     * @param alias 系统操作别名
     * @param moduleName 所属模块英文名
     * @return 记录数
     */
    public long getCount(String enname, String alias, String moduleName) {
    	List<Object> params = new ArrayList<Object>();

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("select count(*) from SysActionEntity a where 1=1 ");
        
        if(StrUtils.isNotEmpty(enname)) {
            stringBuilder.append("and a.enname like ? ");
            params.add("%" + enname + "%");
        }

        if(StrUtils.isNotEmpty(alias)) {
            stringBuilder.append("and a.alias like ? ");
            params.add("%" + alias + "%");
        }

        if(StrUtils.isNotEmpty(moduleName)) {
            stringBuilder.append("and a.moduleName = ? ");
            params.add(moduleName);
        }
        
        Query query = getSession().createQuery(stringBuilder.toString());
        for (int i = 0; i < params.size(); i++) {
            query.setParameter(i, params.get(i));
        }
        return (Long)query.uniqueResult();
    }    
}
